#!/usr/bin/env python
# -*- coding: utf-8//IGNORE', $string); -*-

'''
@author: Tiago Barriga Nº6048, Belisa Castelhano Nº6303
@obs: Trabalho em python na disciplina LP
ficehiro responsavel pelas operações sobre a base de dados
apartir da leitura do xls
'''

import os
import xlrd
import sqlalchemy
from sqlalchemy.ext.declarative import declarative_base
Base = declarative_base()
from sqlalchemy import Column, Integer, String
from sqlalchemy.orm import sessionmaker
from sqlalchemy import create_engine
import tkFileDialog
import tkMessageBox
import Tkinter

filename = None


def read_xls(row, col):
    '''
    metodo que recebe as posições da celula a ser lida apartir dos parametos
    @Param row -> linha a ser lida 
    @Param col -> coluna a ser lida
    @Return conteudo de uma celula do xls
    '''
    return sheet.cell_value(row, col)
    pass




#http://docs.sqlalchemy.org/en/rel_0_7/orm/tutorial.html#declare-a-mapping
class CriacaoTabelas(Base):
     '''
     classe base de dados, responsavel por criar cada tabela a
     ser inserida na base de dados, utilizando a biblioteca sqlalchemy.
     os seus atributos correspondem as colunas para cada linha/tabela
     '''
     __tablename__ = 'inscritos'
 
     id = Column(Integer, primary_key = True )
     Estabelecimento = Column(String)
     Unidade_Organica = Column(String)
     Nivel_Formacao = Column(String)
     Curso_Superior = Column(String)
     Area_Formacao = Column(String)
     Ano95_96 = Column(Integer)
     Ano96_97 = Column(Integer)
     Ano97_98 = Column(Integer)
     Ano98_99 = Column(Integer)
     Ano99_00 = Column(Integer)
     Ano00_01 = Column(Integer)
     Ano01_02 = Column(Integer)
     Ano02_03 = Column(Integer)
     Ano03_04 = Column(Integer)
     Ano04_05 = Column(Integer)
     Ano05_06 = Column(Integer)
     Ano06_07 = Column(Integer)
     Ano07_08 = Column(Integer)
     Ano08_09 = Column(Integer)
     Ano09_10 = Column(Integer)
     Ano10_11 = Column(Integer)
    
     def __init__(self, id, Estabelecimento, Unidade_Organica, Nivel_Formacao,
                  Curso_Superior, Area_Formacao,  Ano95_96, Ano96_97, Ano97_98,
                  Ano98_99, Ano99_00, Ano00_01, Ano01_02, Ano02_03, Ano03_04,
                  Ano04_05, Ano05_06, Ano06_07, Ano07_08, Ano08_09, Ano09_10,
                  Ano10_11):
         
         self.id = id
         self.Estabelecimento = Estabelecimento
         self.Unidade_Organica = Unidade_Organica
         self.Nivel_Formacao = Nivel_Formacao
         self.Curso_Superior = Curso_Superior
         self.Area_Formacao = Area_Formacao
         self.Ano95_96 = Ano95_96
         self.Ano96_97 = Ano96_97
         self.Ano97_98 = Ano97_98
         self.Ano98_99 = Ano98_99
         self.Ano99_00 = Ano99_00
         self.Ano00_01 = Ano00_01
         self.Ano01_02 = Ano01_02
         self.Ano02_03 = Ano02_03
         self.Ano03_04 = Ano03_04
         self.Ano04_05 = Ano04_05
         self.Ano05_06 = Ano05_06
         self.Ano06_07 = Ano06_07
         self.Ano07_08 = Ano07_08
         self.Ano08_09 = Ano08_09
         self.Ano09_10 = Ano09_10
         self.Ano10_11 = Ano10_11  
            
     def __repr__(self):
        return "<CriacaoTabelas('%s','%s', '%s','%s','%s', '%s', '%d')>" % (self.id, self.Estabelecimento, self.Unidade_Organica,
                                                            self.Nivel_Formacao, self.Curso_Superior,
                                                            self.Area_Formacao, self.Ano95_96)


class AccoesBD():
        '''
        classe responsavel pelas acções a serem feitas na base de dados
        '''
        database = None
        login = None
        Base = None
        
        def __init__(self):
            '''
            Cria uma instância mapeada de um banco de dados físico
            '''
            self.database = create_engine('sqlite:///BaseDados.db', echo = False) 
        pass


        def __create_database__(self):
            '''
            Criação e inicialização da base de dados
            Cria uma instância de uma base de dados fisica
            '''
            #self.database = create_engine('sqlite:///BaseDados.db', echo = False)
            Base.metadata.create_all(self.database)
            pass


        def __insert__(self):
            '''
            metodo que cria uma sessão, conecta se à base de dados
            e insere as celulas que se pretende retirar do .xls
            criando assim as tabelas (para cada linha)
            
            liga-se a uma base de dados mapeada,
            onde podemos manipular os dados antes de os guardar.
            '''
            self.login = sessionmaker(bind=self.database)
            self.login.configure(bind=self.database)
            self.login = self.login()
        #####################################
        # preencher tabelas
        #####################################
            ES = read_xls(4, 0)# estabalecimentos
            UO = read_xls(4, 1)# unidade organica
            NF = read_xls(4, 2)# nivel formacão
            
            for x in range(4 , 11957): # percorre o total de linhas
                      
                  self.login.add(CriacaoTabelas(x-4, ES, UO, NF,
                  read_xls(x, 3), read_xls(x, 4),
                  read_xls(x, 7), read_xls(x, 10), # anos
                  read_xls(x, 13), read_xls(x, 16), # anos
                  read_xls(x, 19), read_xls(x, 22), # anos
                  read_xls(x, 25), read_xls(x, 28), # anos
                  read_xls(x, 31), read_xls(x, 34), # anos
                  read_xls(x, 37), read_xls(x, 40), # anos
                  read_xls(x, 43), read_xls(x, 47), # anos
                  read_xls(x, 50), read_xls(x, 53))) # anos

                  # se não tiver nada preenche com o mesmo nome que na tabela anterior na mesma celula
                  if (read_xls(x+1, 0) != "" ):# se a proxima celula for diferente de ""
                      ES = (read_xls(x+1, 0))
                      pass
                  if (read_xls(x+1, 1) != ""):# se a proxima celula for diferente de ""
                      UO = (read_xls(x+1, 1))
                      pass
                  if (read_xls(x+1, 2) != ""):# se a proxima celula for diferente de ""
                      NF = (read_xls(x+1, 2))
                      pass
                
                  pass
        
            self.__commit__()    
            pass

        def __commit__(self):
            '''
            metodo para fazer commit à base de dados, após serem introduzidas as
            tabelas
            '''
            self.login.query(CriacaoTabelas).all()
            self.login.commit()
            pass

        def __dropBD__(self):
            '''
            apaga base de dados atraves da biblioteca do sistema (OS)
            '''
            os.remove("BaseDados.db")
            pass
        
pass



filename = 'Inscritos_2010-2011.xls'
try:
    ficheiro_xls = xlrd.open_workbook(filename)
    pass
except OSError, e: # surpress IOError: [Errno 2] No such file or directory: 'Inscritos_2010-2011.xls'
    if e.errno == 2:
        # suppress "No such file or directory" error
        pass
except:
    pass

try:
    sheet = ficheiro_xls.sheet_by_name(u'Tabela 4.1')
    pass
except NameError: #surppres NameError: name 'ficheiro_xls' is not defined
    tmp_tkinter = Tkinter.Tk()
    tkMessageBox.showinfo("Exception!","Não tem o ficheiro 'Inscritos_2010-2011' na directria do 'Main.py' pressione OK e selecione onde tem o ficheiro! ")
    filename = tkFileDialog.askdirectory(parent=tmp_tkinter ,initialdir="/",title='Selecione o a DIRECTORIA onde o ficheiro .xls se encontra')
    filename = filename + "/Inscritos_2010-2011.xls"
    ficheiro_xls = xlrd.open_workbook(filename)
    sheet = ficheiro_xls.sheet_by_name(u'Tabela 4.1')
    tmp_msg = tkMessageBox
    tmp_msg.showinfo("AGUARDE!"," Esta a abrir a interface ")
    tmp_tkinter.destroy()
    pass

filename = 'Inscritos_2010-2011.xls'
#AccoesBD().__create_database__()
#AccoesBD().__insert__()




